#pragma once
#include "logger.hpp"

namespace mylog{
    Logger::ptr GetLogger(const std::string& name){
        return LoggerManager::GetInstance()->GetLogger(name);
    }

    Logger::ptr RootLogger(){
        return LoggerManager::GetInstance()->RootLogger();
    }

    #define Debug(fmt, ...) Debug(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define Info(fmt, ...) Info(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define Warning(fmt, ...) Warning(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define Error(fmt, ...) Error(__FILE__, __LINE__, fmt, ##__VA_ARGS__)
    #define Fatal(fmt, ...) Fatal(__FILE__, __LINE__, fmt, ##__VA_ARGS__)

    #define LOG_DEBUG(logger, fmt, ...) (logger)->Debug(fmt, ##__VA_ARGS__)
    #define LOG_INFO(logger, fmt, ...) (logger)->Info(fmt, ##__VA_ARGS__)
    #define LOG_WARNING(logger, fmt, ...) (logger)->Warning(fmt, ##__VA_ARGS__)
    #define LOG_ERROR(logger, fmt, ...) (logger)->Error(fmt, ##__VA_ARGS__)
    #define LOG_FATAL(logger, fmt, ...) (logger)->Fatal(fmt, ##__VA_ARGS__)

    #define LOGD(fmt, ...) LOG_DEBUG(mylog::RootLogger(), fmt, ##__VA_ARGS__)
    #define LOGI(fmt, ...) LOG_INFO(mylog::RootLogger(), fmt, ##__VA_ARGS__)
    #define LOGW(fmt, ...) LOG_WARNING(mylog::RootLogger(), fmt, ##__VA_ARGS__)
    #define LOGE(fmt, ...) LOG_ERROR(mylog::RootLogger(), fmt, ##__VA_ARGS__)
    #define LOGF(fmt, ...) LOG_FATAL(mylog::RootLogger(), fmt, ##__VA_ARGS__)
}